package com.itheima.d3_annotation;

import java.lang.reflect.Method;

/**
 * 案例：模拟Junit框架的设计。
 *
 * 需求
 * 定义若干个方法，只要加了MyTest注解，就可以在启动时被触发执行
 *
 * 分析
 * 1.定义一个自定义注解MyTest，只能注解方法，存活范围是一直都在。
 * 2.定义若干个方法，只要有@MyTest注解的方法就能在启动时被触发执行，没有这个注解的方法不能执行。
 * 3.模拟一个junit程序，可以触发加了@MyTest注解的方法执行
 *
 *
 * 磊哥：这就是注解的应用场景，注解就是用来标记某个程序，然后让其他的程序根据注解信息决定怎么去对待加了注解的程序。比如说本次案例的，加了注解的就执行，不加的就不执行
 */
public class AnnotationTest4 {
    // @MyTest
    public void test1(){
        System.out.println("===test1====");
    }

    @MyTest
    public void test2(){
        System.out.println("===test2====");
    }

    @MyTest
    public void test3(){
        System.out.println("===test3====");
    }

    @MyTest
    public void test4(){
        System.out.println("===test4====");
    }

    public static void main(String[] args) throws Exception {

        AnnotationTest4 a = new AnnotationTest4();
        // 启动程序！拿到所有的方法，然后挨个挨个问里面的方法是否有@MyTest注解，有的话就执行，来达到模拟“触发加了@MyTest注解的方法执行”

        // 1、得到Class对象
        Class c = AnnotationTest4.class;
        // 2、提取这个类中的全部成员方法
        Method[] methods = c.getDeclaredMethods();
        // 3、遍历这个数组中的每个方法，看方法上是否存在@MyTest注解，存在
        // 触发该方法执行。
        for (Method method : methods) {
            //isAnnotationPresent方法： 判断当前对象是否使用了指定的注解，如果使用了则返回true，否则false
            if(method.isAnnotationPresent(MyTest.class)){
                // 说明当前方法上是存在@MyTest，触发当前方法执行。
                // * Object invoke(Object obj, Object... args)参数一：用obj对象调用该方法。参数二：调用方法的传递的参数（如果没有就不写）。返回值：方法的返回值（如果没有就不写）
                method.invoke(a);   //有异常，直接抛出去
            }
        }
    }
}
